const axios = require('axios');
const fs = require('fs');


/**
 *使用axios发起get请求，并将其封装为promise对象
 *
 * @param {*} url 
 * @returns 返回 axios 的response.data
 */
function getData (url) {
  return new Promise((resolve, reject) => {
    axios.get(url)
      .then(res => {
        // console.log(res.data);
        resolve(res.data);
      })
      .catch((err) => {
        reject(err.data);
      });
  });
}

// 获取指定年份页面中的数据所在地址

/**
 *获取指定年份页面中的数据所在地址
 *
 * @param {*} str 页面完整html
 * @returns 返回数据所在地址，例如：https://www.qschina.cn/sites/default/files/qs-rankings-data/cn/2005378.txt
 */
function getUrl (str) {
  const regex = /rank_url.*?(\d+\.txt)/m;
  let m;
  let baseUrl = 'https://www.qschina.cn/sites/default/files/qs-rankings-data/cn/';
  if ((m = regex.exec(str)) !== null) {
    return baseUrl + m[1];
  }
}

// 

/**
 *使用正则获取大学名称，从"<div class="td-wrap"><a href="/universities/university-amsterdam" class="uni-link">阿姆斯特丹大学</a></div>"中，获取“阿姆斯特丹大学”
 *
 * @param {*} str，例如"<div class="td-wrap"><a href="/universities/university-amsterdam" class="uni-link">阿姆斯特丹大学</a></div>"
 * @returns 返回大学名称
 */
function getUniversityTitle (str) {
  const regex = /<div.*?link">(.*?)<\/a><\/div>/;
  let m;
  if ((m = regex.exec(str)) !== null) {
    // console.log(m[1]);
    return m[1];
  }
}

// 提取数据
// title: "<div class="td-wrap"><a href="/universities/university-amsterdam" class="uni-link">阿姆斯特丹大学</a></div>",
// logo: "/sites/default/files/university-of-amsterdam_18_small.jpg",
// score: "96.5",
// rank_display: "1",
function getCommRankingsByYear (year, data) {
  // console.log(year, data);
  let dataList = [];
  for (const key in data) {
    let university = getUniversityTitle(data[key]['title']);
    let score = data[key]['score'];
    let rank = data[key]['rank_display'];
    dataList.push({ year, university, score, rank });
  }
  return dataList;
}

// 写入CSV头部信息
function writeHeadToCsv (head) {
  const writeStream = fs.createWriteStream('test.csv');
  writeStream.write(head);
}

function getRank (str) {
  const regex = /(\d+)/;
  let m;
  if ((m = regex.exec(str)) !== null) {
    // console.log(m[1]);
    return m[1];
  }
  return rank;
}

// 将数据写入到csv文件中
function writeRankingsToCsv (arr) {
  const writeStream = fs.createWriteStream('test.csv', { flags: 'a' });
  for (const key in arr) {
    let rank = getRank(arr[key]['rank']);
    writeStream.write(`${arr[key]['year']},${arr[key]['university']},${arr[key]['score']},${rank}\n`);
  }
}

// 生成历年排名页面地址
function getRankUrls () {
  let rankUrls = [];
  for (let year = 2017; year <= 2020; year++) {
    let url = `https://www.qschina.cn/university-rankings/university-subject-rankings/${year}/communication-media-studies`;
    rankUrls.push({ 'year': year, 'url': url });
  }
  // console.log(rankUrls);
  return rankUrls;
}

// 主函数
async function main () {
  let rankUrls = getRankUrls();
  let head = '年份,大学,得分,排名\n';
  writeHeadToCsv(head);
  for (const key in rankUrls) {
    let year = rankUrls[key]['year'];
    let url = rankUrls[key]['url'];
    await getData(url)
      .then((value) => {
        // console.log(value);
        // 获取到数据所在地址
        return getUrl(value);
      })
      .then((value) => {
        // 使用得到的地址，发起排名数据请求
        // console.log(value);
        return getData(value);
      })
      .then((value) => {
        // 提取数据
        // console.log(value);
        // console.log(getCommRankingsByYear('2020', value['data']));
        return getCommRankingsByYear(year, value['data']);
      })
      .then((value) => {
        writeRankingsToCsv(value);
      });
  }
}

main();
